﻿// 041. 包含min函数的栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <stack>

using namespace std;

/*
https://www.acwing.com/problem/content/90/

设计一个支持push，pop，top等操作并且可以在O(1)时间内检索出最小元素的堆栈。

push(x)–将元素x插入栈中
pop()–移除栈顶元素
top()–得到栈顶元素
getMin()–得到栈中最小元素
数据范围
操作命令总数 [0,100]。

样例
MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin();   --> Returns -4.
minStack.pop();
minStack.top();      --> Returns 3.
minStack.getMin();   --> Returns -1.
*/

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> mainS;
    stack<int> minS;
    MinStack() {

    }

    void push(int x) {
        mainS.push(x);    
        if (minS.empty() || x <= minS.top()) { minS.push(x); }
    }

    void pop() {
        int popv = mainS.top(); mainS.pop();
        while (!minS.empty()) {
            if (minS.top() > popv) { minS.pop(); }
            else if (minS.top() == popv) { minS.pop(); break; }
            else { break; }
        }
    }

    int top() {
        return mainS.top();
    }

    int getMin() {
        return minS.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */


int main()
{
    MinStack* minStack = new MinStack();
    minStack->push(1);
}
 